package com.hw.shortlink.project.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hw.shortlink.project.dao.entity.*;
import com.hw.shortlink.project.dao.mapper.*;
import com.hw.shortlink.project.dto.req.ShortLinkAccessRecordReqDto;
import com.hw.shortlink.project.dto.req.ShortLinkGroupAccessRecordReqDto;
import com.hw.shortlink.project.dto.req.ShortLinkGroupStatsReqDto;
import com.hw.shortlink.project.dto.req.ShortLinkStatsReqDto;
import com.hw.shortlink.project.dto.resp.*;
import com.hw.shortlink.project.service.ShortLinkStatsService;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration;
import org.springframework.stereotype.Service;

import java.util.*;

import static java.util.stream.Collectors.toList;

@Service
@RequiredArgsConstructor
public class ShortLinkStatsServiceImpl implements ShortLinkStatsService {

    private static final Logger log = LoggerFactory.getLogger(ShortLinkStatsServiceImpl.class);
    private final LinkAccessStatsMapper linkAccessStatsMapper;
    private final LinkAccessLogsMapper linkAccessLogsMapper;
    private final LinkLocaleStatsMapper linkLocaleStatsMapper;
    private final LinkBrowserStatsMapper linkBrowserStatsMapper;
    private final LinkOsStatsMapper linkOsStatsMapper;
    private final LinkDeviceStatsMapper linkDeviceStatsMapper;
    private final LinkNetworkStatsMapper linkNetworkStatsMapper;
    private final WebSocketServletAutoConfiguration webSocketServletAutoConfiguration;


    @Override
    public ShortLinkStatsRespDto getStatsForSingleUrl(ShortLinkStatsReqDto shortLinkStatsReqDto) {
        ShortLinkStatsRespDto result=new ShortLinkStatsRespDto();
        //获取start-end的按照天分隔的dateRangeList
        List<DateTime> dateRangeList = DateUtil.rangeToList(shortLinkStatsReqDto.getStartDate(),
                shortLinkStatsReqDto.getEndDate(), DateField.DAY_OF_MONTH);


        //时间间隔内总的uv,pv,uip
        LinkAccessStats pvUvUidStatsByShortLink = linkAccessLogsMapper.findPvUvUidStatsByShortLink(shortLinkStatsReqDto);
        result.setUv(pvUvUidStatsByShortLink.getUv());
        result.setPv(pvUvUidStatsByShortLink.getPv());
        result.setUip(pvUvUidStatsByShortLink.getUip());



        //每日基础uv，pv，uip的统计数据
        List<LinkAccessStats> linkAccessStatsList = linkAccessStatsMapper.listAccessStatsByShortLink(shortLinkStatsReqDto);
        List<ShortLinkStatsAccessDailyRespDto> daily = new ArrayList<>();
        //补充不存在uv,pv,uip的天的数据
        for (DateTime dateTime : dateRangeList) {
            boolean flag=false;
            for (LinkAccessStats linkAccessStat : linkAccessStatsList) {
                if(linkAccessStat.getDate().equals(dateTime)){
                    daily.add(BeanUtil.copyProperties(linkAccessStat,ShortLinkStatsAccessDailyRespDto.class));
                    flag=true;
                    break;
                }
                if(linkAccessStat.getDate().after(dateTime)) break;
            }
            if(!flag){
                daily.add(new ShortLinkStatsAccessDailyRespDto(dateTime,0,0,0));
            }
        }
        result.setDaily(daily);


        //地区分布
        List<LinkLocaleStats> linkLocaleStatsList = linkLocaleStatsMapper.listLocaleStatsByShortLink(shortLinkStatsReqDto);
        List<ShortLinkStatsLocaleCNRespDto> localeCnStats = BeanUtil.copyToList(
                linkLocaleStatsList,
                ShortLinkStatsLocaleCNRespDto.class,
                CopyOptions.create().setFieldMapping(Map.of("province", "locale"))
        );
        int totalCnt=0;
        for (LinkLocaleStats linkLocaleStats : linkLocaleStatsList) {
            totalCnt+=linkLocaleStats.getCnt();
        }
        for (ShortLinkStatsLocaleCNRespDto shortLinkStatsLocaleCNRespDto : localeCnStats) {
            double ratio = (double) shortLinkStatsLocaleCNRespDto.getCnt() / totalCnt;
            double actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsLocaleCNRespDto.setRatio(actualRatio);
        }
        result.setLocaleCnStats(localeCnStats);


        //小时统计
        List<LinkAccessStats> listHourStatsByShortLink = linkAccessStatsMapper.listHourStatsByShortLink(shortLinkStatsReqDto);
        int[] hours=new int[24];
        for (LinkAccessStats linkAccessStats : listHourStatsByShortLink) {
            hours[linkAccessStats.getHour()]=linkAccessStats.getPv();
        }
        List<Integer> hourStats = Arrays.stream(hours).boxed().toList();
        result.setHourStats(hourStats);


        // 高频访问IP详情
        List<ShortLinkStatsTopIpRespDto> topIpStats = linkAccessLogsMapper.listTopIpByShortLink(shortLinkStatsReqDto);
        result.setTopIpStats(topIpStats);


        // 一周访问详情
        List<LinkAccessStats> listWeekStatsByShortLink = linkAccessStatsMapper.listWeekStatsByShortLink(shortLinkStatsReqDto);
        int[] weeks=new int[8];
        for (LinkAccessStats linkAccessStats : listWeekStatsByShortLink) {
            weeks[linkAccessStats.getWeekday()]=linkAccessStats.getPv();
        }
        List<Integer> weekStats = Arrays.stream(weeks,1,8).boxed().toList();
        result.setWeekdayStats(weekStats);

        // 浏览器访问详情
        List<LinkBrowserStats> linkBrowserStatsList = linkBrowserStatsMapper.listBrowserStatsByShortLink(shortLinkStatsReqDto);
        List<ShortLinkStatsBrowserRespDto> browserStats = BeanUtil.copyToList(linkBrowserStatsList, ShortLinkStatsBrowserRespDto.class);
        totalCnt=0;
        for (LinkBrowserStats linkBrowserStats : linkBrowserStatsList) {
            totalCnt+=linkBrowserStats.getCnt();
        }
        for (ShortLinkStatsBrowserRespDto shortLinkStatsBrowserRespDto : browserStats) {
            double ratio = (double) shortLinkStatsBrowserRespDto.getCnt() / totalCnt;
            double actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsBrowserRespDto.setRatio(actualRatio);
        }
        result.setBrowserStats(browserStats);

        // 操作系统访问详情
        List<LinkOsStats> linkOsStatsList = linkOsStatsMapper.listOsStatsByShortLink(shortLinkStatsReqDto);
        List<ShortLinkStatsOsRespDto> osStats = BeanUtil.copyToList(linkOsStatsList, ShortLinkStatsOsRespDto.class);
        totalCnt=0;
        for (LinkOsStats linkOsStats : linkOsStatsList) {
            totalCnt+=linkOsStats.getCnt();
        }
        for (ShortLinkStatsOsRespDto shortLinkStatsOsRespDto : osStats) {
            double ratio = (double) shortLinkStatsOsRespDto.getCnt() / totalCnt;
            double actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsOsRespDto.setRatio(actualRatio);
        }
        result.setOsStats(osStats);
        // 访客访问类型详情
        HashMap<String, Object> uvTypeCntByShortLink = linkAccessLogsMapper.findUvTypeCntByShortLink(shortLinkStatsReqDto);
        int oldUserCnt = Integer.parseInt(
                Optional.ofNullable(uvTypeCntByShortLink)
                        .map(each -> each.get("oldUserCnt"))
                        .map(Object::toString)
                        .orElse("0")
        );
        int newUserCnt = Integer.parseInt(
                Optional.ofNullable(uvTypeCntByShortLink)
                        .map(each -> each.get("newUserCnt"))
                        .map(Object::toString)
                        .orElse("0")
        );
        totalCnt= oldUserCnt+newUserCnt;

        List<ShortLinkStatsUvRespDto> uvTypeStats=new ArrayList<>();
        double ratio = (double) oldUserCnt/ totalCnt;
        double actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
        uvTypeStats.add(new ShortLinkStatsUvRespDto(oldUserCnt,"老访客",actualRatio));
        ratio = (double) newUserCnt/ totalCnt;
        actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
        uvTypeStats.add(new ShortLinkStatsUvRespDto(newUserCnt,"新访客",actualRatio));
        result.setUvTypeStats(uvTypeStats);


        // 访问设备类型详情
        List<LinkDeviceStats> linkDeviceStatsList = linkDeviceStatsMapper.listDeviceStatsByShortLink(shortLinkStatsReqDto);
        List<ShortLinkStatsDeviceRespDto> deviceStats = BeanUtil.copyToList(linkDeviceStatsList, ShortLinkStatsDeviceRespDto.class);
        totalCnt=0;
        for (LinkDeviceStats linkDeviceStats : linkDeviceStatsList) {
            totalCnt+=linkDeviceStats.getCnt();
        }
        for (ShortLinkStatsDeviceRespDto shortLinkStatsDeviceRespDto : deviceStats) {
            ratio = (double) shortLinkStatsDeviceRespDto.getCnt() / totalCnt;
            actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsDeviceRespDto.setRatio(actualRatio);
        }
        result.setDeviceStats(deviceStats);



        // 访问网络类型详情
        List<LinkNetworkStats> linkNetworkStatsList = linkNetworkStatsMapper.listNetworkStatsByShortLink(shortLinkStatsReqDto);
        List<ShortLinkStatsNetworkRespDto> networkStats = BeanUtil.copyToList(linkNetworkStatsList, ShortLinkStatsNetworkRespDto.class);
        totalCnt=0;
        for (LinkNetworkStats linkNetworkStats : linkNetworkStatsList) {
            totalCnt+=linkNetworkStats.getCnt();
        }
        for (ShortLinkStatsNetworkRespDto shortLinkStatsNetworkRespDto : networkStats) {
            ratio = (double) shortLinkStatsNetworkRespDto.getCnt() / totalCnt;
            actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsNetworkRespDto.setRatio(actualRatio);
        }
        result.setNetworkStats(networkStats);

        return result;
    }

    @Override
    public IPage<ShortLinkAccessRecordRespDto> linkPageQuery(ShortLinkAccessRecordReqDto shortLinkAccessRecordReqDto) {

        IPage<LinkAccessLogs> pageResult =linkAccessLogsMapper.selectPage(shortLinkAccessRecordReqDto,
                new LambdaQueryWrapper<LinkAccessLogs>()
                        .eq(LinkAccessLogs::getFullShortUrl,shortLinkAccessRecordReqDto.getFullShortUrl())
                        //.eq(LinkAccessLogs::getGid,shortLinkAccessRecordReqDto.getGid())

                        .between(LinkAccessLogs::getCreateTime,shortLinkAccessRecordReqDto.getStartDate(), DateUtil.endOfDay(shortLinkAccessRecordReqDto.getEndDate()))
                        .eq(LinkAccessLogs::getDelFlag,0)
        );


        if(pageResult.getTotal()==0){
            return pageResult.convert(linkAccessLogs -> BeanUtil.copyProperties(linkAccessLogs, ShortLinkAccessRecordRespDto.class));
        }
        //获取用户列表
        List<String> users= pageResult.getRecords().stream().map(LinkAccessLogs::getUser).collect(toList());


        List<Map<String,Object>> uvTypeList=linkAccessLogsMapper
                .listUvTypeByUsers(users,shortLinkAccessRecordReqDto.getGid(),
                        shortLinkAccessRecordReqDto.getFullShortUrl(),
                        shortLinkAccessRecordReqDto.getStartDate(),
                        shortLinkAccessRecordReqDto.getEndDate());

        // 转成 user->uvType的map
        Map<String, String> uvTypeMap=new HashMap<>();
        for (Map<String, Object> map : uvTypeList) {
            uvTypeMap.put((String) map.get("user"), (String) map.get("uvType"));
        }


        IPage<ShortLinkAccessRecordRespDto> result = pageResult.convert(linkAccessLogs -> {
            ShortLinkAccessRecordRespDto shortLinkAccessRecordRespDto = BeanUtil.copyProperties(linkAccessLogs, ShortLinkAccessRecordRespDto.class);
            shortLinkAccessRecordRespDto.setUvType(uvTypeMap.get(linkAccessLogs.getUser()));
            return shortLinkAccessRecordRespDto;
        });

        return  result;
    }

    @Override
    public IPage<ShortLinkGroupAccessRecordRespDto> groupPageQuery(ShortLinkGroupAccessRecordReqDto shortLinkGroupAccessRecordReqDto) {
        IPage<LinkAccessLogs> pageResult =linkAccessLogsMapper.selectPage(shortLinkGroupAccessRecordReqDto,
                new LambdaQueryWrapper<LinkAccessLogs>()
                        //.eq(LinkAccessLogs::getGid,shortLinkGroupAccessRecordReqDto.getGid())
                        .between(LinkAccessLogs::getCreateTime,shortLinkGroupAccessRecordReqDto.getStartDate(),DateUtil.endOfDay(shortLinkGroupAccessRecordReqDto.getEndDate()))
                        .eq(LinkAccessLogs::getDelFlag,0)
        );


        if(pageResult.getTotal()==0){
            return pageResult.convert(linkAccessLogs -> BeanUtil.copyProperties(linkAccessLogs, ShortLinkGroupAccessRecordRespDto.class));
        }
        //获取用户列表
        List<String> users= pageResult.getRecords().stream().map(LinkAccessLogs::getUser).collect(toList());


        List<Map<String,Object>> uvTypeList=linkAccessLogsMapper
                .listUvTypeByUsers(users,shortLinkGroupAccessRecordReqDto.getGid(),
                        null,
                        shortLinkGroupAccessRecordReqDto.getStartDate(),
                        shortLinkGroupAccessRecordReqDto.getEndDate());

        // 转成 user->uvType的map
        Map<String, String> uvTypeMap=new HashMap<>();
        for (Map<String, Object> map : uvTypeList) {
            uvTypeMap.put((String) map.get("user"), (String) map.get("uvType"));
        }


        IPage<ShortLinkGroupAccessRecordRespDto> result = pageResult.convert(linkAccessLogs -> {
            ShortLinkGroupAccessRecordRespDto shortLinkAccessRecordRespDto = BeanUtil.copyProperties(linkAccessLogs, ShortLinkGroupAccessRecordRespDto.class);
            shortLinkAccessRecordRespDto.setUvType(uvTypeMap.get(linkAccessLogs.getUser()));
            return shortLinkAccessRecordRespDto;
        });

        return  result;
    }

    @Override
    public ShortLinkGroupStatsRespDto getStatsForGroup(ShortLinkGroupStatsReqDto shortLinkGroupStatsReqDto) {
        ShortLinkGroupStatsRespDto result=new ShortLinkGroupStatsRespDto();
        //获取start-end的按照天分隔的dateRangeList
        List<DateTime> dateRangeList = DateUtil.rangeToList(shortLinkGroupStatsReqDto.getStartDate(),
                shortLinkGroupStatsReqDto.getEndDate(), DateField.DAY_OF_MONTH);

        //时间间隔内总的uv,pv,uip
        LinkAccessStats pvUvUidStatsByGroup = linkAccessLogsMapper.findPvUvUidStatsByGroup(shortLinkGroupStatsReqDto);
        result.setUv(pvUvUidStatsByGroup.getUv());
        result.setPv(pvUvUidStatsByGroup.getPv());
        result.setUip(pvUvUidStatsByGroup.getUip());


        //每日基础uv，pv，uip的统计数据
        List<LinkAccessStats> groupAccessStatsList = linkAccessStatsMapper.listAccessStatsByGroup(shortLinkGroupStatsReqDto);
        List<ShortLinkStatsAccessDailyRespDto> daily = new ArrayList<>();
        //补充不存在uv,pv,uip的天的数据
        for (DateTime dateTime : dateRangeList) {
            boolean flag=false;
            for (LinkAccessStats groupAccessStat : groupAccessStatsList) {
                if(groupAccessStat.getDate().equals(dateTime)){
                    daily.add(BeanUtil.copyProperties(groupAccessStat,ShortLinkStatsAccessDailyRespDto.class));
                    flag=true;
                    break;
                }
                if(groupAccessStat.getDate().after(dateTime)) break;
            }
            if(!flag){
                daily.add(new ShortLinkStatsAccessDailyRespDto(dateTime,0,0,0));
            }
        }
        result.setDaily(daily);


        //地区分布
        List<LinkLocaleStats> groupLocaleStatsList = linkLocaleStatsMapper.listLocaleStatsByGroup(shortLinkGroupStatsReqDto);
        List<ShortLinkStatsLocaleCNRespDto> localeCnStats = BeanUtil.copyToList(
                groupLocaleStatsList,
                ShortLinkStatsLocaleCNRespDto.class,
                CopyOptions.create().setFieldMapping(Map.of("province", "locale"))
        );
        int totalCnt=0;
        for (LinkLocaleStats groupLocaleStats : groupLocaleStatsList) {
            totalCnt+=groupLocaleStats.getCnt();
        }
        for (ShortLinkStatsLocaleCNRespDto shortLinkStatsLocaleCNRespDto : localeCnStats) {
            double ratio = (double) shortLinkStatsLocaleCNRespDto.getCnt() / totalCnt;
            double actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsLocaleCNRespDto.setRatio(actualRatio);
        }
        result.setLocaleCnStats(localeCnStats);


        //小时统计
        List<LinkAccessStats> listHourStatsByGroup = linkAccessStatsMapper.listHourStatsByGroup(shortLinkGroupStatsReqDto);
        int[] hours=new int[24];
        for (LinkAccessStats linkAccessStats : listHourStatsByGroup) {
            hours[linkAccessStats.getHour()]=linkAccessStats.getPv();
        }
        List<Integer> hourStats = Arrays.stream(hours).boxed().toList();
        result.setHourStats(hourStats);


        // 高频访问IP详情
        List<ShortLinkStatsTopIpRespDto> topIpStats = linkAccessLogsMapper.listTopIpByGroup(shortLinkGroupStatsReqDto);
        result.setTopIpStats(topIpStats);


        // 一周访问详情
        List<LinkAccessStats> listWeekStatsByGroup = linkAccessStatsMapper.listWeekStatsByGroup(shortLinkGroupStatsReqDto);
        int[] weeks=new int[8];
        for (LinkAccessStats linkAccessStats : listWeekStatsByGroup) {
            weeks[linkAccessStats.getWeekday()]=linkAccessStats.getPv();
        }
        List<Integer> weekStats = Arrays.stream(weeks,1,8).boxed().toList();
        result.setWeekdayStats(weekStats);

        // 浏览器访问详情
        List<LinkBrowserStats> groupBrowserStatsList = linkBrowserStatsMapper.listBrowserStatsByGroup(shortLinkGroupStatsReqDto);
        List<ShortLinkStatsBrowserRespDto> browserStats = BeanUtil.copyToList(groupBrowserStatsList, ShortLinkStatsBrowserRespDto.class);
        totalCnt=0;
        for (LinkBrowserStats linkBrowserStats : groupBrowserStatsList) {
            totalCnt+=linkBrowserStats.getCnt();
        }
        for (ShortLinkStatsBrowserRespDto shortLinkStatsBrowserRespDto : browserStats) {
            double ratio = (double) shortLinkStatsBrowserRespDto.getCnt() / totalCnt;
            double actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsBrowserRespDto.setRatio(actualRatio);
        }
        result.setBrowserStats(browserStats);

        // 操作系统访问详情
        List<LinkOsStats> groupOsStatsList = linkOsStatsMapper.listOsStatsByGroup(shortLinkGroupStatsReqDto);
        List<ShortLinkStatsOsRespDto> osStats = BeanUtil.copyToList(groupOsStatsList, ShortLinkStatsOsRespDto.class);
        totalCnt=0;
        for (LinkOsStats linkOsStats : groupOsStatsList) {
            totalCnt+=linkOsStats.getCnt();
        }
        for (ShortLinkStatsOsRespDto shortLinkStatsOsRespDto : osStats) {
            double ratio = (double) shortLinkStatsOsRespDto.getCnt() / totalCnt;
            double actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsOsRespDto.setRatio(actualRatio);
        }
        result.setOsStats(osStats);
        // 访客访问类型详情
        HashMap<String, Object> uvTypeCntByGroup = linkAccessLogsMapper.findUvTypeCntByGroup(shortLinkGroupStatsReqDto);
        int oldUserCnt = Integer.parseInt(
                Optional.ofNullable(uvTypeCntByGroup)
                        .map(each -> each.get("oldUserCnt"))
                        .map(Object::toString)
                        .orElse("0")
        );
        int newUserCnt = Integer.parseInt(
                Optional.ofNullable(uvTypeCntByGroup)
                        .map(each -> each.get("newUserCnt"))
                        .map(Object::toString)
                        .orElse("0")
        );
        totalCnt= oldUserCnt+newUserCnt;

        List<ShortLinkStatsUvRespDto> uvTypeStats=new ArrayList<>();
        double ratio = (double) oldUserCnt/ totalCnt;
        double actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
        uvTypeStats.add(new ShortLinkStatsUvRespDto(oldUserCnt,"老访客",actualRatio));
        ratio = (double) newUserCnt/ totalCnt;
        actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
        uvTypeStats.add(new ShortLinkStatsUvRespDto(newUserCnt,"新访客",actualRatio));
        result.setUvTypeStats(uvTypeStats);


        // 访问设备类型详情
        List<LinkDeviceStats> groupDeviceStatsList = linkDeviceStatsMapper.listDeviceStatsByGroup(shortLinkGroupStatsReqDto);
        List<ShortLinkStatsDeviceRespDto> deviceStats = BeanUtil.copyToList(groupDeviceStatsList, ShortLinkStatsDeviceRespDto.class);
        totalCnt=0;
        for (LinkDeviceStats linkDeviceStats : groupDeviceStatsList) {
            totalCnt+=linkDeviceStats.getCnt();
        }
        for (ShortLinkStatsDeviceRespDto shortLinkStatsDeviceRespDto : deviceStats) {
            ratio = (double) shortLinkStatsDeviceRespDto.getCnt() / totalCnt;
            actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsDeviceRespDto.setRatio(actualRatio);
        }
        result.setDeviceStats(deviceStats);



        // 访问网络类型详情
        List<LinkNetworkStats> groupNetworkStatsList = linkNetworkStatsMapper.listNetworkStatsByGroup(shortLinkGroupStatsReqDto);
        List<ShortLinkStatsNetworkRespDto> networkStats = BeanUtil.copyToList(groupNetworkStatsList, ShortLinkStatsNetworkRespDto.class);
        totalCnt=0;
        for (LinkNetworkStats linkNetworkStats : groupNetworkStatsList) {
            totalCnt+=linkNetworkStats.getCnt();
        }
        for (ShortLinkStatsNetworkRespDto shortLinkStatsNetworkRespDto : networkStats) {
            ratio = (double) shortLinkStatsNetworkRespDto.getCnt() / totalCnt;
            actualRatio = Math.round(ratio * 100.0) / 100.0;//四舍五入
            shortLinkStatsNetworkRespDto.setRatio(actualRatio);
        }
        result.setNetworkStats(networkStats);

        return result;



    }
}
